package org.jeecgframework.codegenerate.util;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class FileUtils {
 public static List<String> fileTypes = new ArrayList<String>();//a
 public static List<String> ftlTypes = new ArrayList<String>();//b
 
 static {
	 fileTypes.add(".svn");
	 fileTypes.add("CVS");
	 fileTypes.add(".cvsignore");
	 fileTypes.add(".copyarea.db");
	 fileTypes.add("SCCS");
	 fileTypes.add("vssver.scc");
	 fileTypes.add(".DS_Store");
	 fileTypes.add(".git");
	 fileTypes.add(".gitignore");
	 ftlTypes.add(".ftl");
 }

 public static List<File> getFiles(File file) throws IOException {
	 List<File> files = new ArrayList<File>();
	 addFiles(file, files);
     Collections.sort(files, new Comparator<File>() {
		@Override
		public int compare(File o1, File o2) {
			return o1.getAbsolutePath().compareTo(o2.getAbsolutePath());
		}
     });
     return files;
 }
 

 public static void addFiles(File file, List<File> files) throws IOException {
     if (!file.isHidden() && file.isDirectory() && !checkFileType(file)) {
         File[] fileArr = file.listFiles();

         for(int i = 0; i < fileArr.length; ++i) {
        	 addFiles(fileArr[i], files);
         }
     } else if (!checkFreemarkType(file) && !checkFileType(file)) {
    	 files.add(file);
     }

 }

 public static String getFileAbsolutePath(File file0, File file1) {//
     if (file0.equals(file1)) {
         return "";
     } else {
         return file0.getParentFile() == null ? file1.getAbsolutePath().substring(file0.getAbsolutePath().length()) : file1.getAbsolutePath().substring(file0.getAbsolutePath().length() + 1);
     }
 }

 public static boolean getFileName(File file) {//b
     return file.isDirectory() ? false : checkFileType(file.getName());
 }

 public static boolean checkFileType(String var0) {
     return !StringUtils.isBlank(getFileSuffix(var0));
 }

 public static String getFileSuffix(String fileName) {//b
     if (fileName == null) {
         return null;
     } else {
         int index = fileName.indexOf(".");
         return index == -1 ? "" : fileName.substring(index + 1);
     }
 }

 public static File file(String fileName) {//c
     if (fileName == null) {
         throw new IllegalArgumentException("file must be not null");
     } else {
         File file = new File(fileName);
         mkdirParentDir(file);
         return file;
     }
 }

 public static void mkdirParentDir(File file) {//c
     if (file.getParentFile() != null) {
    	 file.getParentFile().mkdirs();
     }

 }

 private static boolean checkFileType(File file) {//d
     for(int i = 0; i < fileTypes.size(); ++i) {
         if (file.getName().equals(fileTypes.get(i))) {
             return true;
         }
     }

     return false;
 }

 private static boolean checkFreemarkType(File file) {//e
     for(int i = 0; i < ftlTypes.size(); ++i) {
         if (file.getName().endsWith((String)ftlTypes.get(i))) {
             return true;
         }
     }
     return false;
 }

}
